/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.TipoUnidade;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Msg;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.Marker;
import org.primefaces.model.map.Polygon;

/**
 *
 * @author ely
 */
@ManagedBean
@ViewScoped
public class ManagerCriarUnidade {

    @EJB
    UnidadeServico unidadeServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    BairroServico bairroServico;
    @EJB
    EquipeServico equipeServico;
    
    private Unidade unidade;
    private Area area;
    private List<Coordenada> coordenadas;
    private Coordenada coordenada;
    private Polygon polygon;
    private LatLng coord = null;
    private DefaultMapModel mapModel;
    private boolean disableEnderecoImovel;
    private boolean mensagemCep;
    private List<Equipe> equipeSelecionados;
    private Equipe equipeSelecionado;
    private Equipe equipePesquisar;
    private List<Equipe> equipesPesquisar;
    private Equipe equipeRemover;

    @PostConstruct
    public void init() {

        unidade = new Unidade();
        unidade.setEndereco(new Endereco());
        area = new Area();
        coordenada = new Coordenada();
        coordenadas = new ArrayList<Coordenada>();
        mapModel = new DefaultMapModel();
        polygon = new Polygon();
        mensagemCep = false;
        disableEnderecoImovel = true;
        equipeSelecionados = new ArrayList<Equipe>();
        equipePesquisar = new Equipe();
        equipeSelecionado = new Equipe();
        equipesPesquisar = new ArrayList<Equipe>();

    }

    public void handlePointClick(PointSelectEvent event) {

        LatLng latLng = event.getLatLng();

        addOverlayToMapModel(new Marker(latLng));

        mapModel.addOverlay(polygon);

        for (Marker premarker : mapModel.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    private void addOverlayToMapModel(Marker marker) {
        mapModel.addOverlay(marker);
        polygon.getPaths().add(marker.getLatlng());
        polygon.setStrokeColor("#FF9900");
        polygon.setFillColor("#FF9900");
        polygon.setFillOpacity(0.2);
    }

    public void onMarkerDrag(MarkerDragEvent event) {
        Marker marker = event.getMarker();

        for (Marker marker1 : mapModel.getMarkers()) {
            if (marker.getId().equals(marker1.getId())) {
                marker1.setLatlng(marker.getLatlng());
                break;
            }
        }

        polygon = new Polygon();

        List<Marker> markers = mapModel.getMarkers();
        mapModel = new DefaultMapModel();

        for (Marker m : markers) {
            addOverlayToMapModel(m);
        }
        mapModel.addOverlay(polygon);

        for (Marker premarker : mapModel.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    public void salvar() {
        try {
            Bairro bairro;
            for (Marker marker : mapModel.getMarkers()) {
                coordenada = new Coordenada();
                coordenada.setLat(marker.getLatlng().getLat());
                coordenada.setLng(marker.getLatlng().getLng());
                coordenadas.add(coordenada);
            }

            area.setCoordenadas(coordenadas);
            unidade.setArea(area);

            bairro = bairroServico.findBairro(unidade.getEndereco().getBairro().getNome());
            if (bairro.getId() == null) {
                bairroServico.salvar(unidade.getEndereco().getBairro());
                unidade.getEndereco().setBairro(bairro);
            } else {
                unidade.getEndereco().setBairro(bairro);
            }

            unidadeServico.salvar(unidade);
            Msg.messagemInfo(Msg.SuccessFull);
            init();
        } catch (Exception erro) {
        }
    }

    public void existeEndereco() {
        Endereco endereco;

        endereco = enderecoServico.existCep(unidade.getEndereco());

        if (endereco != null) {
            unidade.setEndereco(endereco);
            disableEnderecoImovel = true;
            mensagemCep = false;
        } else {
            mensagemCep = true;
            disableEnderecoImovel = false;
        }

    }

    public void pesquisarEquipe() {
        equipesPesquisar = equipeServico.findEquipe(equipePesquisar);
    }

    public void selecionarEquipe() {
        this.equipeSelecionados.add(this.equipeSelecionado);
    }

    public void removerEquipe() {
        equipeSelecionados.remove(equipeRemover);
    }
    public void setRemoverEquipe(Equipe equi){
        this.equipeRemover = equi;
    } 

    public List<SelectItem> tipoUnidade() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoUnidade tipo : TipoUnidade.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }

    public Coordenada getCoordenada() {
        return coordenada;
    }

    public void setCoordenada(Coordenada coordenada) {
        this.coordenada = coordenada;
    }

    public List<Coordenada> getCoordenadas() {
        return coordenadas;
    }

    public void setCoordenadas(List<Coordenada> coordenadas) {
        this.coordenadas = coordenadas;
    }

    public Polygon getPolygon() {
        return polygon;
    }

    public void setPolygon(Polygon polygon) {
        this.polygon = polygon;
    }

    public LatLng getCoord() {
        return coord;
    }

    public void setCoord(LatLng coord) {
        this.coord = coord;
    }

    public DefaultMapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(DefaultMapModel mapModel) {
        this.mapModel = mapModel;
    }

    public Unidade getUnidade() {
        return unidade;
    }

    public void setUnidade(Unidade unidade) {
        this.unidade = unidade;
    }

    public boolean isDisableEnderecoImovel() {
        return disableEnderecoImovel;
    }

    public void setDisableEnderecoImovel(boolean disableEnderecoImovel) {
        this.disableEnderecoImovel = disableEnderecoImovel;
    }

    public boolean isMensagemCep() {
        return mensagemCep;
    }

    public void setMensagemCep(boolean mensagemCep) {
        this.mensagemCep = mensagemCep;
    }

    public List<Equipe> getEquipeSelecionados() {
        return equipeSelecionados;
    }

    public void setEquipeSelecionados(List<Equipe> equipeSelecionados) {
        this.equipeSelecionados = equipeSelecionados;
    }

    public Equipe getEquipePesquisar() {
        return equipePesquisar;
    }

    public void setEquipePesquisar(Equipe equipePesquisar) {
        this.equipePesquisar = equipePesquisar;
    }

    public List<Equipe> getEquipesPesquisar() {
        return equipesPesquisar;
    }

    public void setEquipesPesquisar(List<Equipe> equipesPesquisar) {
        this.equipesPesquisar = equipesPesquisar;
    }

    public Equipe getEquipeSelecionado() {
        return equipeSelecionado;
    }

    public void setEquipeSelecionado(Equipe equipeSelecionado) {
        this.equipeSelecionado = equipeSelecionado;
    }

    public Equipe getEquipeRemover() {
        return equipeRemover;
    }

    public void setEquipeRemover(Equipe equipeRemover) {
        this.equipeRemover = equipeRemover;
    }
     
    
}
